/* 注意几个坑：
1. 注意地图服务的名字，和图层的索引。索引错了，没有添加效果，也不执行完成的回调。
2. 注意添加的点要素的属性字段，只能添加之前在mapgis数据库中已经有的字段值，
如果添加之前没有的字段值，也无法添加成功，且不执行完成的回调。
3. 如果mapgis数据库中的字段，不是在图层创建的时候一开始就添加的，
而是图层创建之后又附加的。这部分属性，在地图服务中可能无法得到。
即使重新保存地图文档并发布地图服务，这部分新增的属性可能地图服务中依然没有。
也会导致2.中的情况。
4. 添加时属性字段的name值有重复，也不行。也不执行完成的回调。
如，['name_城市','name_城市','name_人口','name_城市级别']
 */
// PS.multiPoint。在geojson数据中
// 添加一个点
/**
 * // 要添加的点的经纬度坐标位置
 * @param {Array} position =[120,40]
 * // mapGis数据库中，对于这个点图层的每个点要素，
 * // 除了默认的几个属性之外，又新添加了哪些属性的键和值：
 * @param {Array}  attr = [
 *      {name:"name_城市",value:"value_武汉",type:"type_string"},
 *      {name:"name_人口",value:"value_500万",type:"type_string"}，
 *      {name:"name_城市级别",value:"value_新一线城市",type:"type_string"}
 * ]
 * // name:地图文档服务的名称 , layerId:要向其添加点的图层的索引从0开始，从上往下计数
 * （0 1 2 3 ……）
 * @param {Object} service = {name:"xxx",layerId:xx}
 */
// 都是 new Zondy.Object.XXX()
class Point {
  // 添加点，要调用的函数。
  static add({ position, attr, service, docLayer }) {
    var gpoint = new Zondy.Object.GPoint(position[0], position[1]); //createPoint();
    //设置当前点要素的几何信息
    var fGeom = new Zondy.Object.FeatureGeometry({ PntGeom: [gpoint] });
    // var point = new ol.Feature({
    //     geometry:new ol.geom.Point()
    // })
    /* 1-2、样式  图形参数信息 */
    var pointInfo = new Zondy.Object.CPointInfo({
      Angle: 0,
      Color: 11, //子图颜色
      Space: 0,
      SymHeight: 5, //高度
      SymID: 31, //子图号
      SymWidth: 5, //宽度
    });
    //设置当前点要素的图形参数信息
    var webGraphicInfo = new Zondy.Object.WebGraphicsInfo({
      /* 1-point  2--LineString  3--Area */
      InfoType: 1,
      PntInfo: pointInfo,
    });
    /* 1-3、attValue：属性的值 */
    var attValue = attr.map((item) => item.value);
    // ['value_武汉','value_500万','value_新一线城市']
    //创建一个要素
    var feature = new Zondy.Object.Feature({
      fGeom: fGeom,
      GraphicInfo: webGraphicInfo,
      AttValue: attValue,
      // 属性的值(value)：['value_武汉','value_500万','value_新一线城市']
    });
    //设置要素为点要素
    feature.setFType(1);
    /* 2、创建要素集 */
    //创建一个要素数据集 // (类似ol中的source new ol.source.Vector())
    var featureSet = new Zondy.Object.FeatureSet();
    //设置属性结构
    var cAttStruct = new Zondy.Object.CAttStruct({
      // 每个字段的名字(属性名)(name)
      FldName: attr.map((item) => item.name), // ['name_城市','name_人口','name_城市级别']
      // 字段的数量(有多少个字段)
      FldNumber: attr.length, // 3
      // 每个字段的类型(type)
      FldType: attr.map((item) => item.type), // ['type_string','type_string','type_string']
    });
    featureSet.AttStruct = cAttStruct;
    //添加要素到要素数据集
    // Ps.由于上方feature边的点几何可以不止一个点，也可以是多个点
    // 所以此处addFeature，也可能是往featureSet这个要素数据集里边添加了多个点
    featureSet.addFeature(feature);
    /* 3、调用服务添加要素 */
    /* 第一个参数 igserver服务的名称
       第二个参数 是添加要素所在的图层
    */
    //创建一个要素编辑服务对象
    var editService = new Zondy.Service.EditDocFeature(
      service.name, // 地图服务的名称
      service.layerId, // 所要将点添加到的图层的索引(0 1 2 3 ……)
      {} // 第三个参数这里，传一个空对象即可
      /* { // 或者写全地图服务的ip和端口号
        ip: 'localhost',
        port: 6163,
      } */
    );
    //添加要素数据集
    editService.add(featureSet, this.onPntSuccess(docLayer));
  }
  // 添加点完成后的回调：
  static onPntSuccess(docLayer) {
    return function (data) {
      console.log(data, "data");
      if (data.succeed) {
        alert("添加点要素成功！");
        docLayer.refresh();
      } else {
        alert("添加点要素失败！");
      }
    };
  }
}
